package 多线程.多线程同步的5种方法;

import java.util.Date;

/**
 * @date 2017/8/31.
 * @author 廖述京
 */
/*
又乱了。这是为什么呢？就是因为volatile不能保证原子操作导致的，因此volatile不能代替synchronized。
此外volatile会组织编译器对代码优化，因此能不使用它就不使用它吧。
它的原理是：每次要线程要访问volatile修饰的变量时，都是从内存中读取，而不是存缓存当中读取，
           因此每个线程访问到的变量值都是一样的。这样就保证了同步。
出现线程不安全的问题分析：
     使用volatile修饰账户余额变量后，变量安全了(每个线程获得都将值更新到内存，也都从内存读取)，但是有线程安全问题，如
     存入100元后，接下来要显示了。但此时线程切换到取100元，账户余额变为0，更新到内存。接下来，显示存入100元后账户余额，此时为0
     ，很明显，不安全！
 */
public class VolatileVar_Bank {
    private volatile int count =0;//账户余额

    //存钱
    public  void addMoney(int money){
        count +=money;
        System.out.println(new Date(System.currentTimeMillis()).toLocaleString()+"存进："+money);
    }

    //取钱
    public  void subMoney(int money){
        if(count-money < 0){
            System.out.println("余额不足");
            return;
        }
        count -=money;
        System.out.println(new Date(System.currentTimeMillis()).toLocaleString()+"取出："+money);
    }

    //查询
    public void lookMoney(){
        System.out.println("账户余额："+count);
    }
}
